﻿using System.IO;
using HK.Core.Utils;
using UnityEditor;
using UnityEngine.SceneManagement;

namespace HK.Editor.Utils
{
    /// <summary>
    /// 工具类 : IO(Editor)
    /// <para>* 文件、目录等IO对象相关处理。</para>
    /// </summary>
    public static class UtilsEditorIo
    {

#region Scene

        /// <summary>
        /// 验证场景有效性
        /// </summary>
        /// <param name="iSceneSettings">场景设定</param>
        /// <returns>true:OK; false:NG;</returns>
        public static bool VerifyScene(EditorBuildSettingsScene iSceneSettings)
        {
            if (null == iSceneSettings) return false;
            var sceneGuid = iSceneSettings.guid;
            var scenePath = AssetDatabase.GUIDToAssetPath(sceneGuid.ToString());
            if (string.IsNullOrEmpty(scenePath) || !File.Exists(scenePath)) return false;
            return !UtilsString.Diff(scenePath, iSceneSettings.path);
        }

        /// <summary>
        /// 验证场景有效性
        /// </summary>
        /// <param name="iScene">场景</param>
        /// <returns>true:OK; false:NG;</returns>
        public static bool VerifyScene(Scene iScene)
        {
            if (-1 == iScene.buildIndex || string.IsNullOrEmpty(iScene.path) || !File.Exists(iScene.path)) return false;
            return true;
        }

#endregion

#region Check

        /// <summary>
        /// Lua文件更名
        /// <para>* lua文件在打包Ab的时候，Unity不识别文件后缀为*.lua的文件</para>
        /// <para>* 这里需要将*.lua -> *.lua.bytes的文件</para>
        /// </summary>
        /// <param name="iAssetKey">文件路径</param>
        /// <returns>null:无需更名; 其他:更改后的新名字;</returns>
        public static string RenameLuaFile(string iAssetKey)
        {
            // 非Lua文件，则无需更名
            if (!UtilsIo.IsLuaFile(iAssetKey, true)) return null;
            // 统一路径，一律转换成消息额
            var fileExtension = UtilsIo.GetFileExtension(iAssetKey);
            var filePath = iAssetKey;
            if (!string.IsNullOrEmpty(fileExtension))
            {
                filePath = filePath.Replace(fileExtension, "");
                filePath = $"{filePath}{fileExtension.ToLower()}";
            }
	        
            // 已经是*.lua.bytes的文件，则无需更名
            if (filePath.EndsWith(".lua.bytes")) return filePath;
            var newFilePath = $"{filePath}.bytes";
            if (File.Exists(newFilePath))
            {
                File.Delete(newFilePath);
            }
	        
            // 移动文件
            File.Move(iAssetKey, newFilePath);
	        
            // 再次校验是否文件移动成功
            if (File.Exists(newFilePath))
            {
                return newFilePath;
            }
	        
            // 文件更名失败
            return null;
        }
        
        /// <summary>
        /// 恢复Lua文件原本的名字
        /// </summary>
        /// <param name="iFormerPath">原本路径</param>
        /// <param name="iNewPath">新路径</param>
        /// <returns>true:恢复成功; false:恢复失败;</returns>
        public static bool ResumeLuaFileFormerName(string iFormerPath, string iNewPath)
        {
            if(string.IsNullOrEmpty(iFormerPath) || string.IsNullOrEmpty(iNewPath)) return false;
            // 新文件不存在
            if(!File.Exists(iNewPath)) return false;
			
            // 源文件存在，则删除
            if (File.Exists(iFormerPath))
            {
                File.Delete(iFormerPath);
            }
			
            // 移动文件
            File.Move(iNewPath, iFormerPath);
			
            // 源文件存在，则删除
            if (File.Exists(iFormerPath))
            {
                return true;
            }
            return false;
        }

#endregion
        
    }
}
